import { defineConfig, loadEnv } from 'vite'
import { resolve } from 'path'
// vue
import vue from '@vitejs/plugin-vue'

// html内容调整 插件
import { createHtmlPlugin } from 'vite-plugin-html'

// 压缩插件
import viteCompression from 'vite-plugin-compression'

// ui自动导入插件
import Components from 'unplugin-vue-components/vite'
import { ElementPlusResolver } from 'unplugin-vue-components/resolvers'

// setup name 增强
import VueSetupExtend from 'vite-plugin-vue-setup-extend'

// 自动导入composition api
import AutoImport from 'unplugin-auto-import/vite'
import { autoImportList, lodashList } from './src/utils/autoImport'

// Mars3d
// 		"mars3d": "3.4.25",
//		"mars3d-cesium": "1.102.0",
// import { vitePluginMars3d } from 'vite-plugin-mars3d'

// 将css转换成兼容多种浏览器的样式
const postcssPresetEnv = require('postcss-preset-env')

// https://vitejs.dev/config/
export default ({ command, mode }) => {
	// 环境变量
	const env = loadEnv(mode, process.cwd())
	// 生产环境判断
	const isEnvProduction = ['production'].includes(mode)
	// vite插件
	const plugins = [
		vue({
			// 支持自定义元素 自定义的标签不是vue组件消除警告
			template: {
				compilerOptions: {
					isCustomElement: (tag) => tag.startsWith('iconpark-')
				}
			}
		}),
		VueSetupExtend(),
		/**
		 *  注入环境变量到html模板中
		 *  如在  .env文件中有环境变量  VITE_APP_TITLE=admin
		 *  则在 html模板中  可以这样获取  <%- VITE_APP_TITLE %>
		 *  文档：  https://github.com/anncwb/vite-plugin-html
		 */
		createHtmlPlugin({
			inject: {
				data: {
					TITLE: '自动化融合平台',
					injectScript: `<script src="/config.js?v=${new Date().getTime()}"></script>`
				}
			},
			minify: true
		}),
		/**
		 * ui按需加载(自动导入)自动导入Vite的按需组件
		 */
		Components({
			resolvers: [ElementPlusResolver()],
			dts: '.components.d.js'
		}),
		// api、icon等自动导入
		AutoImport({
			imports: [
				'vue',
				'vue-router',
				{
					// 使用的时候才会自动导入，检查js代码
					'@/utils/autoImport': autoImportList,
					lodash: lodashList
				}
			], // 自动导入vue和vue-router相关函数
			resolvers: [ElementPlusResolver()],
			dts: '.auto-import.d.js' // 生成 `auto-import.d.js` 全局声明
		})
		// vitePluginMars3d()
	]
	// 打包环境
	let build = {
		// 打包生产环境移除 console 和 debugger
		outDir: 'dist',
		assetsInlineLimit: 1024,
		cssCodeSplit: true,
		chunkSizeWarningLimit: 1000,
		brotliSize: false, //关闭打包计算
		minify: 'esbuild',
		rollupOptions: {
			output: {
				chunkFileNames: 'js/[name]-[hash].js',
				entryFileNames: 'js/[name]-[hash].js'
			}
		}
	}
	if (isEnvProduction) {
		plugins.push(
			// gzip插件，打包压缩代码成gzip  文档： https://github.com/anncwb/vite-plugin-compression
			viteCompression()
		)

		// Terser 相对较慢，但大多数情况下构建后的文件体积更小。ESbuild 最小化混淆更快但构建后的文件相对更大。
		build.minify = 'terser'
		// 打包生产环境移除 console 和 debugger
		build.terserOptions = {
			compress: {
				drop_console: true,
				drop_debugger: true
			}
		}
	}
	return defineConfig({
		// 基础路径，配合vue-router的createWebHashHistory使用
		base: isEnvProduction ? '/' : './',
		css: {
			// 消除vite2打包出现警告，"@charset" must be the first，
			preprocessorOptions: {
				scss: {
					charset: false,
					javascriptEnabled: true,
					additionalData: `@import "src/style/mixin/index.scss";`
				}
			},
			// 消除vite2打包出现警告，"@charset" must be the first，
			postcss: {
				plugins: [
					postcssPresetEnv(),
					{
						postcssPlugin: 'internal:charset-removal',
						AtRule: {
							charset: (atRule) => {
								if (atRule.name === 'charset') {
									atRule.remove()
								}
							}
						}
					}
				]
			}
		},
		plugins,
		build,
		server: {
			host: '0.0.0.0',
			port: 5000,
			open: true,
			proxy: {
				// 设置代理
				[env.VITE_APP_BASE_API]: {
					target: env.VITE_APP_TARGET,
					changeOrigin: true,
					rewrite: (path) => path.replace(env.VITE_APP_BASE_API, env.VITE_APP_TI)
				}
			}
		},
		// alias 现在会被传递给 @rollup/plugin-alias 并不再需要开始/结尾处的斜线了。
		// 此行为目前是一个直接替换，所以 1.0 风格的目录别名需要删除其结尾处的斜线：
		resolve: {
			alias: {
				// 如果报错__dirname找不到，需要安装node,执行yarn add @types/node --save-dev
				'@': resolve(__dirname, 'src'),
				'@a': resolve(__dirname, 'src/api'),
				'@u': resolve(__dirname, 'src/utils'),
				'@c': resolve(__dirname, 'src/components')
			}
		}
	})
}
